package 刷题.速成清单;

import java.util.Scanner;

// 定义一个名为 BubbleSort 的类，用于实现冒泡排序算法
public class BubbleSort {
    public static void main(String[] args) {
        // 创建一个 Scanner 对象，用于从控制台读取用户输入
        Scanner in = new Scanner(System.in);

        // 提示用户输入数组的长度，并读取该长度值
        // 输入数组长度
        int n = in.nextInt();

        // 根据用户输入的长度创建一个整数类型的数组
        int[] arr = new int[n];

        // 使用 for 循环，让用户依次输入数组的每个元素
        // 输入数组元素
        for (int i = 0; i < n; i++) {
            // 读取用户输入的元素值，并将其存储到数组的相应位置
            arr[i] = in.nextInt();
        }

        // 调用 bubbleSort 方法对数组进行排序
        // 调用冒泡排序方法
        bubbleSort(arr);

        // 使用增强 for 循环遍历排序后的数组
        // 输出排序后的数组
        for (int num : arr) {
            // 打印数组中的每个元素，并在元素后面添加一个空格
            System.out.print(num + " ");
        }

        // 关闭 Scanner 对象，释放资源
        in.close();
    }

    // 定义一个静态方法 bubbleSort，用于实现冒泡排序算法
    public static void bubbleSort(int[] arr) {
        // 获取数组的长度
        int n = arr.length;

        // 外层循环控制排序的轮数，总共需要进行 n - 1 轮排序
        for (int i = 0; i < n - 1; i++) {
            // 内层循环用于比较相邻元素，并在必要时交换它们的位置
            // 每一轮排序后，最大的元素会“冒泡”到数组的末尾，所以内层循环的范围会逐渐缩小
            for (int j = 0; j < n - i - 1; j++) {
                // 比较相邻的两个元素，如果前一个元素大于后一个元素
                if (arr[j] > arr[j + 1]) {
                    // 交换 arr[j] 和 arr[j + 1] 的值
                    // 使用一个临时变量 temp 来存储 arr[j] 的值
                    int temp = arr[j];
                    // 将 arr[j + 1] 的值赋给 arr[j]
                    arr[j] = arr[j + 1];
                    // 将临时变量 temp 中存储的 arr[j] 的值赋给 arr[j + 1]
                    arr[j + 1] = temp;
                }
            }
        }
    }
}
